function curry(func) {
  return function curriedFn(...args) {
    //  实际参数args的个数 < 形式参数func的个数 返回新的函数
    if (args.length < func.length) {
      // 返回的函数需要等待更多参数
      // 闭包保存了上次留下来的args的，也就是从func中传递过来的，所以要先做一次参数的合并
      // 第二次传递的就是arguments args是上一次传递的参数 闭包保留了下来
      // 利用concat把伪数组转成数组然后concat合并
      // 然后把数组展开一次传递给函数
      return function () {
        return curriedFn(...args.concat(Array.from(arguments)))
      }
    }
    // 如果实际参数args >= 形式参数func 直接调用函数执行就可以了! apply或者...
    return func(...args)
  }
}

function curry(func) {
  return function curriedFn(...args) {
    if (args.length < func.length) {
      return function () {
        // args是上次调用的参数，arguments是当前的
        return curriedFn(...args.concat(Array.from(arguments)))
      }
    }
    // 直到形参=实参，返回参数的结果
    return func(...args)
  }
}
